package com.cskaoyan.javase.exception.handle2.finally5;

/**
 * @description: finally关键字
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * finally关键字 无法单独使用
 * 必须和try...catch一起使用，放在catch代码块下面
 * 1,如果trycatch正常执行，catch代码块正常的捕获异常
 * 这时候finally代码块被执行了
 *
 * 2，如果try...catch没有捕获到对应的异常，这个时候异常抛给jvm。程序终止
 * finally代码块当中代码被执行了，并且是在异常报错程序终止之前执行的
 *
 * 3，如果没有异常，程序正常
 * 那么finally当中的代码仍有要被执行
 *
 * 综上：finally代码块中的代码，无论try..catch是什么执行结果，它都会执行
 * 根据它这个特点，它经常被用来释放资源（IO的时候特别常用）
 *
 * 因为finally一直被执行的特点，就有面试题搞出来了
 * 把finally和return放一块
 * 1,catch代码块中有一个return
 * 这个时候仍然会执行finally 但是return会结束当前方法，所以finally之后就不会输出了
 *
 * 2,如果try中有一个return，如果上面有代码发生异常，不会执行该return，仍然会执行finally
 * 如果try当中只有一个return，那么仍然会执行finally中代码，然后回到try当中的return
 *
 * 3，如果catch和final当中都有一个return
 * 它会先执行finally，然后从finally中的return结束方法，不会返回catch代码块
 * 当然finally仍然会执行
 *
 * 以上记住：return不能阻止finally代码执行
 *
 * 扩充一点：
 * 如果真的想让finally不执行，也是有办法的：
 * System.exit(0);  立刻马上退出jvm
 *
 * final，finally和finalize的区别
 *   final:  最终的
 * 	可以修饰类 成员变量 成员方法
 *        类:类不能被继承
 *        成员变量:常量
 *        成员方法: 不能被重写
 *    finally: 异常处理体系当中,用于资源释放.最大的特点  必然会执行
 *    finalize: Object()类中的成员方法,垃圾回收。但是注意jvm有自己的垃圾回收机制，并不会因为你调用这个方法就立刻回收对象。
 *
 *
 */
public class Demo {
    public static void main(String[] args) {

        try {
            System.out.println(10/0);
            //String s = null;
            //System.out.println(s.length());
            //return;
        }
        catch (ArithmeticException ae){
            ae.printStackTrace();
            System.out.println("catch return 之前");
            System.exit(0);
            //return; //结束了main方法
        }
        finally {
            System.out.println("finally");
            //return;
        }
        //System.out.println("finally之后");

    }
}
